package com.zty.websocket.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @Author ZTY
 * @Description 当我们谈到在Java项目中集成WebSocket时，我们谈论的是一种强大的通信协议，它允许实时双向通信，就像你和朋友之间的即时聊天一样。
 * 在传统的Web应用程序中，客户端（通常是浏览器）通过向服务器发送HTTP请求来获取数据，而服务器则通过HTTP响应返回数据。
 * 这种请求-响应模式适用于许多场景，但在某些情况下，它并不适合实时通信或需要频繁更新数据的场景。
 * 这就是WebSocket的用武之地。WebSocket提供了一种持久的、全双工的通信通道，允许服务器和客户端之间实时地发送消息，
 * 而无需每次都发送HTTP请求。这样，服务器可以主动向客户端推送数据，而不需要等待客户端的请求。
 * <p>
 * 现在，让我们看看为什么在Java项目中集成WebSocket是有益的：
 * 1. 实时通信：WebSocket允许服务器和客户端之间进行实时双向通信。
 * 这对于实时聊天应用程序、在线游戏、实时协作工具等场景非常有用。
 * 通过WebSocket，你可以实时地将数据推送给客户端，而客户端也可以实时地向服务器发送消息。
 * <p>
 * 2. 减少延迟：由于WebSocket使用持久连接，而不是每次都发送HTTP请求，因此可以减少通信的延迟。
 * 这对于需要快速响应和实时更新的应用程序非常重要。WebSocket的低延迟特性使得它成为实时数据传输的理想选择。
 * <p>
 * 3. 节省带宽：由于WebSocket使用持久连接，相比于频繁的HTTP请求，它可以减少网络通信的开销和带宽消耗。
 * 这对于移动应用程序和具有大量用户的应用程序来说尤为重要，可以提高应用程序的性能和可扩展性。
 * <p>
 * 4. 简化开发：Java中有一些成熟的WebSocket库和框架，如Java API for WebSocket（JSR 356）、Spring WebSocket等，
 * 它们提供了方便的API和工具，简化了在Java项目中集成WebSocket的开发过程。
 * 这使得开发人员可以更轻松地实现实时通信功能，而无需从头编写复杂的通信逻辑。
 * 综上所述，集成WebSocket可以为Java项目带来实时通信、低延迟、节省带宽和简化开发等好处。
 * 它适用于需要实时更新和双向通信的应用程序，如实时聊天、在线游戏和实时协作工具等。
 * 通过集成WebSocket，你可以让你的应用程序更加动态、响应更快，并提供更好的用户体验。
 * @Date 13:49 2023-12-15
 **/


/**
 * WebSocket通信、HTTP通信和RPC通信都是用于实现不同场景下的网络通信的协议。它们之间的联系和异同如下：
 *
 * 联系：
 * 1. 都是用于实现网络通信的协议，可以在客户端和服务端之间进行数据传输。
 * 2. 都是基于TCP协议的，可以保证数据传输的可靠性和稳定性。
 * 3. 都可以使用Java语言进行开发和实现。
 *
 * 异同：
 * 1. WebSocket通信和HTTP通信都是面向文本的协议，而RPC通信是面向二进制的协议。
 * 2. WebSocket通信和HTTP通信都是基于请求-响应模式的，而RPC通信是基于远程过程调用的。
 * 3. WebSocket通信和HTTP通信都是通过URL进行通信，而RPC通信则是通过调用指定方法来进行通信。
 *
 * 在Java项目中，较为常用的通信协议包括：
 *
 * 1. HTTP协议：用于实现Web应用程序的网络通信，常用于前后端交互和API接口的调用。
 * 2. WebSocket协议：用于实现实时通信的网络协议，常用于在线聊天、游戏等场景。
 * 3. RPC协议：用于实现远程过程调用的网络协议，常用于分布式系统和微服务架构中的服务调用。
 *
 * 这些通信协议一般用于以下场景：
 * 1. HTTP协议：常用于Web应用程序的前后端交互、API接口的调用以及文件的上传和下载等场景。
 * 2. WebSocket协议：常用于实现在线聊天、游戏、股票行情等实时通信场景。
 * 3. RPC协议：常用于分布式系统和微服务架构中的服务调用，可以实现不同服务之间的数据传输和调用。
 */
@Configuration
public class WebSocketConfig {

    /**
     * 这段代码的主要目的是创建一个ServerEndpointExporter对象并将其注册到Spring容器中。
     * ServerEndpointExporter是一个Spring Boot提供的WebSocket支持类，
     * 它可以自动注册所有使用@ServerEndpoint注解声明的WebSocket端点。
     *
     * 在使用WebSocket时，需要在Spring Boot应用程序中注册ServerEndpointExporter对象，
     * 以便Spring Boot能够自动检测和管理WebSocket端点。
     * 因此，这段代码的作用就是创建一个ServerEndpointExporter对象并将其注册到Spring容器中，以便启用WebSocket支持。
     *
     * 一般要考虑到鉴权的事，不能谁要连都能同意，通过
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}
